package main

import "fmt"

type User2 struct {
	name string
	age  int
	sex  string
}

func main() {

	//结构体类型 包.struct名
	user1 := User2{"kaungshen", 18, "男"}
	fmt.Println(user1)
	fmt.Printf("%T,%p\n", user1, &user1)

	//结构体是值类型
	user2 := user1
	fmt.Println(user2)
	fmt.Printf("%T,%p\n", user2, &user2)

	user2.name = "tywin"
	fmt.Println(user2)
	fmt.Println(user1)
	//表明结构体是值类型

	//指针可以解决值传递问题
	var user_prt *User2
	user_prt = &user1
	fmt.Println(*user_prt)

	//原始写法:
	(*user_prt).name = "wujiang"
	fmt.Println(*user_prt)
	fmt.Println(user1)

	//语法糖:
	user_prt.name = "jinhonghao"
	fmt.Println(user1)

	//内置函数new创建对象。
	//new关键字创建的对象，都返回指针，而不是结构体对象
	//func new(Type) *Type
	user3 := new(User2)
	//new函数是返回的是指针类型
	fmt.Println(user3)

	(*user3).name = "小红"
	user3.sex = "女"
	user3.age = 18
	fmt.Println(*user3)

	updateUser(user3)
	fmt.Println(*user3)
}
func updateUser(user *User2) {
	user.age = 20
}
